package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.ThirdPartyIntegration;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 第三方集成数据访问层
 */
@Mapper
public interface ThirdPartyIntegrationMapper extends BaseMapper<ThirdPartyIntegration> {
    
    /**
     * 分页查询第三方集成
     */
    IPage<ThirdPartyIntegration> selectPageList(Page<ThirdPartyIntegration> page,
                                                @Param("name") String name,
                                                @Param("integrationType") String integrationType,
                                                @Param("systemType") String systemType,
                                                @Param("status") String status,
                                                @Param("connectionStatus") String connectionStatus,
                                                @Param("category") String category,
                                                @Param("enabled") Boolean enabled,
                                                @Param("createdBy") String createdBy,
                                                @Param("startTime") LocalDateTime startTime,
                                                @Param("endTime") LocalDateTime endTime,
                                                @Param("keyword") String keyword,
                                                @Param("tenantId") String tenantId);
    
    /**
     * 根据名称查询第三方集成
     */
    List<ThirdPartyIntegration> selectByName(@Param("name") String name,
                                             @Param("tenantId") String tenantId);
    
    /**
     * 根据外部ID查询第三方集成
     */
    ThirdPartyIntegration selectByExternalId(@Param("externalId") String externalId,
                                             @Param("tenantId") String tenantId);
    
    /**
     * 根据业务键查询第三方集成
     */
    ThirdPartyIntegration selectByBusinessKey(@Param("businessKey") String businessKey,
                                              @Param("tenantId") String tenantId);
    
    /**
     * 根据集成类型查询第三方集成
     */
    List<ThirdPartyIntegration> selectByIntegrationType(@Param("integrationType") String integrationType,
                                                        @Param("tenantId") String tenantId);
    
    /**
     * 根据系统类型查询第三方集成
     */
    List<ThirdPartyIntegration> selectBySystemType(@Param("systemType") String systemType,
                                                   @Param("tenantId") String tenantId);
    
    /**
     * 根据状态查询第三方集成
     */
    List<ThirdPartyIntegration> selectByStatus(@Param("status") String status,
                                               @Param("tenantId") String tenantId);
    
    /**
     * 根据连接状态查询第三方集成
     */
    List<ThirdPartyIntegration> selectByConnectionStatus(@Param("connectionStatus") String connectionStatus,
                                                         @Param("tenantId") String tenantId);
    
    /**
     * 根据分类查询第三方集成
     */
    List<ThirdPartyIntegration> selectByCategory(@Param("category") String category,
                                                 @Param("tenantId") String tenantId);
    
    /**
     * 根据创建人查询第三方集成
     */
    List<ThirdPartyIntegration> selectByCreatedBy(@Param("createdBy") String createdBy,
                                                  @Param("tenantId") String tenantId);
    
    /**
     * 查询启用的第三方集成
     */
    List<ThirdPartyIntegration> selectEnabledIntegrations(@Param("tenantId") String tenantId);
    
    /**
     * 查询可连接的第三方集成
     */
    List<ThirdPartyIntegration> selectConnectableIntegrations(@Param("tenantId") String tenantId);
    
    /**
     * 查询自动同步的第三方集成
     */
    List<ThirdPartyIntegration> selectAutoSyncIntegrations(@Param("tenantId") String tenantId);
    
    /**
     * 查询实时同步的第三方集成
     */
    List<ThirdPartyIntegration> selectRealtimeSyncIntegrations(@Param("tenantId") String tenantId);
    
    /**
     * 查询正在同步的第三方集成
     */
    List<ThirdPartyIntegration> selectSyncingIntegrations(@Param("tenantId") String tenantId);
    
    /**
     * 查询有依赖关系的第三方集成
     */
    List<ThirdPartyIntegration> selectDependentIntegrations(@Param("integrationId") String integrationId,
                                                            @Param("tenantId") String tenantId);
    
    /**
     * 更新第三方集成状态
     */
    int updateStatus(@Param("id") String id,
                     @Param("status") String status,
                     @Param("updatedBy") String updatedBy,
                     @Param("updatedByName") String updatedByName);
    
    /**
     * 更新连接状态
     */
    int updateConnectionStatus(@Param("id") String id,
                               @Param("connectionStatus") String connectionStatus,
                               @Param("lastConnectedTime") LocalDateTime lastConnectedTime);
    
    /**
     * 更新最后同步时间
     */
    int updateLastSyncTime(@Param("id") String id,
                           @Param("lastSyncTime") LocalDateTime lastSyncTime);
    
    /**
     * 批量更新状态
     */
    int batchUpdateStatus(@Param("ids") List<String> ids,
                          @Param("status") String status,
                          @Param("updatedBy") String updatedBy,
                          @Param("updatedByName") String updatedByName);
    
    /**
     * 批量更新优先级
     */
    int batchUpdatePriority(@Param("ids") List<String> ids,
                            @Param("priority") Integer priority,
                            @Param("updatedBy") String updatedBy,
                            @Param("updatedByName") String updatedByName);
    
    /**
     * 批量更新分类
     */
    int batchUpdateCategory(@Param("ids") List<String> ids,
                            @Param("category") String category,
                            @Param("updatedBy") String updatedBy,
                            @Param("updatedByName") String updatedByName);
    
    /**
     * 批量更新排序
     */
    int batchUpdateSortOrder(@Param("ids") List<String> ids,
                             @Param("sortOrder") Integer sortOrder,
                             @Param("updatedBy") String updatedBy,
                             @Param("updatedByName") String updatedByName);
    
    /**
     * 检查名称是否可用
     */
    int checkNameAvailable(@Param("name") String name,
                           @Param("excludeId") String excludeId,
                           @Param("tenantId") String tenantId);
    
    /**
     * 检查业务键是否可用
     */
    int checkBusinessKeyAvailable(@Param("businessKey") String businessKey,
                                  @Param("excludeId") String excludeId,
                                  @Param("tenantId") String tenantId);
    
    /**
     * 获取第三方集成统计信息
     */
    Map<String, Object> selectStatistics(@Param("tenantId") String tenantId);
    
    /**
     * 按状态统计第三方集成数量
     */
    List<Map<String, Object>> selectStatsByStatus(@Param("tenantId") String tenantId);
    
    /**
     * 按集成类型统计第三方集成数量
     */
    List<Map<String, Object>> selectStatsByIntegrationType(@Param("tenantId") String tenantId);
    
    /**
     * 按系统类型统计第三方集成数量
     */
    List<Map<String, Object>> selectStatsBySystemType(@Param("tenantId") String tenantId);
    
    /**
     * 按连接状态统计第三方集成数量
     */
    List<Map<String, Object>> selectStatsByConnectionStatus(@Param("tenantId") String tenantId);
    
    /**
     * 按分类统计第三方集成数量
     */
    List<Map<String, Object>> selectStatsByCategory(@Param("tenantId") String tenantId);
    
    /**
     * 按创建人统计第三方集成数量
     */
    List<Map<String, Object>> selectStatsByCreatedBy(@Param("tenantId") String tenantId);
    
    /**
     * 按时间统计第三方集成数量
     */
    List<Map<String, Object>> selectStatsByTime(@Param("startTime") LocalDateTime startTime,
                                                 @Param("endTime") LocalDateTime endTime,
                                                 @Param("timeUnit") String timeUnit,
                                                 @Param("tenantId") String tenantId);
    
    /**
     * 按月份统计第三方集成数量
     */
    List<Map<String, Object>> selectStatsByMonth(@Param("year") Integer year,
                                                  @Param("tenantId") String tenantId);
    
    /**
     * 获取连接成功率统计
     */
    Map<String, Object> selectConnectionSuccessRateStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取同步成功率统计
     */
    Map<String, Object> selectSyncSuccessRateStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取平均响应时间统计
     */
    Map<String, Object> selectAvgResponseTimeStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取性能统计
     */
    Map<String, Object> selectPerformanceStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取错误统计
     */
    Map<String, Object> selectErrorStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取今日统计
     */
    Map<String, Object> selectTodayStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取本周统计
     */
    Map<String, Object> selectWeeklyStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取本月统计
     */
    Map<String, Object> selectMonthlyStats(@Param("tenantId") String tenantId);
    
    /**
     * 查询分类列表
     */
    List<String> selectCategoryList(@Param("tenantId") String tenantId);
    
    /**
     * 查询集成类型列表
     */
    List<String> selectIntegrationTypeList(@Param("tenantId") String tenantId);
    
    /**
     * 查询系统类型列表
     */
    List<String> selectSystemTypeList(@Param("tenantId") String tenantId);
    
    /**
     * 查询标签列表
     */
    List<String> selectTagList(@Param("tenantId") String tenantId);
    
    /**
     * 获取最大排序值
     */
    Integer selectMaxSortOrder(@Param("tenantId") String tenantId);
    
    /**
     * 更新版本号
     */
    int updateVersion(@Param("id") String id,
                      @Param("version") Integer version);
    
    /**
     * 查询相关第三方集成
     */
    List<ThirdPartyIntegration> selectRelatedIntegrations(@Param("integrationId") String integrationId,
                                                          @Param("tenantId") String tenantId);
    
    /**
     * 查询依赖关系
     */
    List<Map<String, Object>> selectDependencyRelations(@Param("integrationId") String integrationId,
                                                         @Param("tenantId") String tenantId);
    
    /**
     * 查询子第三方集成
     */
    List<ThirdPartyIntegration> selectChildIntegrations(@Param("parentId") String parentId,
                                                        @Param("tenantId") String tenantId);
    
    /**
     * 查询父第三方集成
     */
    ThirdPartyIntegration selectParentIntegration(@Param("childId") String childId,
                                                  @Param("tenantId") String tenantId);
    
    /**
     * 查询第三方集成链
     */
    List<ThirdPartyIntegration> selectIntegrationChain(@Param("integrationId") String integrationId,
                                                       @Param("tenantId") String tenantId);
    
    /**
     * 查询最近连接的第三方集成
     */
    List<ThirdPartyIntegration> selectRecentConnectedIntegrations(@Param("limit") Integer limit,
                                                                  @Param("tenantId") String tenantId);
    
    /**
     * 查询连接失败的第三方集成
     */
    List<ThirdPartyIntegration> selectConnectionFailedIntegrations(@Param("tenantId") String tenantId);
    
    /**
     * 查询即将同步的第三方集成
     */
    List<ThirdPartyIntegration> selectUpcomingSyncIntegrations(@Param("minutes") Integer minutes,
                                                               @Param("tenantId") String tenantId);
    
    /**
     * 查询长时间未同步的第三方集成
     */
    List<ThirdPartyIntegration> selectLongTimeNoSyncIntegrations(@Param("hours") Integer hours,
                                                                 @Param("tenantId") String tenantId);
    
    /**
     * 查询同步时间过长的第三方集成
     */
    List<ThirdPartyIntegration> selectLongSyncTimeIntegrations(@Param("minutes") Integer minutes,
                                                               @Param("tenantId") String tenantId);
    
    /**
     * 查询高频同步的第三方集成
     */
    List<ThirdPartyIntegration> selectHighFrequencySyncIntegrations(@Param("tenantId") String tenantId);
    
    /**
     * 查询资源消耗大的第三方集成
     */
    List<ThirdPartyIntegration> selectHighResourceIntegrations(@Param("tenantId") String tenantId);
    
    /**
     * 查询热门第三方集成
     */
    List<ThirdPartyIntegration> selectPopularIntegrations(@Param("limit") Integer limit,
                                                          @Param("tenantId") String tenantId);
    
    /**
     * 查询问题第三方集成
     */
    List<ThirdPartyIntegration> selectProblematicIntegrations(@Param("tenantId") String tenantId);
    
    /**
     * 查询高性能第三方集成
     */
    List<ThirdPartyIntegration> selectHighPerformanceIntegrations(@Param("limit") Integer limit,
                                                                  @Param("tenantId") String tenantId);
    
    /**
     * 获取连接趋势
     */
    List<Map<String, Object>> selectConnectionTrend(@Param("integrationId") String integrationId,
                                                     @Param("days") Integer days,
                                                     @Param("tenantId") String tenantId);
    
    /**
     * 获取同步趋势
     */
    List<Map<String, Object>> selectSyncTrend(@Param("integrationId") String integrationId,
                                               @Param("days") Integer days,
                                               @Param("tenantId") String tenantId);
    
    /**
     * 获取性能趋势
     */
    List<Map<String, Object>> selectPerformanceTrend(@Param("integrationId") String integrationId,
                                                      @Param("days") Integer days,
                                                      @Param("tenantId") String tenantId);
    
    /**
     * 获取错误趋势
     */
    List<Map<String, Object>> selectErrorTrend(@Param("integrationId") String integrationId,
                                                @Param("days") Integer days,
                                                @Param("tenantId") String tenantId);
    
    /**
     * 查询集成历史
     */
    List<ThirdPartyIntegration> selectIntegrationHistory(@Param("integrationId") String integrationId,
                                                         @Param("limit") Integer limit,
                                                         @Param("tenantId") String tenantId);
    
    /**
     * 查询集成详情
     */
    ThirdPartyIntegration selectIntegrationDetail(@Param("id") String id,
                                                   @Param("tenantId") String tenantId);
    
    /**
     * 查询相关集成
     */
    List<ThirdPartyIntegration> selectRelatedIntegrationsByType(@Param("integrationType") String integrationType,
                                                                @Param("systemType") String systemType,
                                                                @Param("tenantId") String tenantId);
}